package datatypes;

public class SuperMarket {
	private TLista productos;

	public SuperMarket() {
		this.productos = new TLista();
	}

	public TLista getProductos() {
		return productos;
	}

	public void setProductos(TLista productos) {
		this.productos = productos;
	}

	/**
	 * Este metodo me asegura que la etiqueta del elemento (TElemento) de la
	 * lista es el mismo que el nombre del producto que se inserta lo cual
	 * facilita la busqueda de los productos luego. Tambien se inserta el
	 * producto con el insertarOrdenado() lo cual asegura que cuando se imprimen
	 * los productos van a estar ordenados por nombre (si es que el insertar
	 * ordenado anda bien).
	 * 
	 * @param producto
	 *            El producto a agregar
	 * @return
	 */
	public Boolean agregarProducto(Producto producto) {
		if (producto != null && productos != null) {
			IElemento elemento = new TElemento();
			elemento.setEtiqueta(producto.getName());
			elemento.setDato(producto);

			return productos.insertarOrdenado(elemento);
		}
		return false;
	}

	/**
	 * Este metodo sirve para aumentar el stock de un producto.
	 * 
	 * @param nombreProducto
	 *            : el producto al que se le quiere aumentar el stock
	 * @param cantidad
	 *            : la cantidad por la cual sele quiere aumentar.
	 * @return
	 */
	public Boolean agregarStock(String nombreProducto, Integer cantidad) {
		/*
		 * me fijo que el producto que le paso no es nulo y que el producto esta
		 * en el supermercado
		 */
		if (nombreProducto != null
				&& productos.buscarElemento(nombreProducto) != null) {
			/*
			 * busco el producto y lo referencio en una variable (el dato del
			 * elemento es el producto y la etiqueta del elemento concide con el
			 * nombre del producto)
			 */
			Producto p = (Producto) productos.buscarElemento(nombreProducto)
					.getDato();
			/*
			 * seteo el stock de dicho producto como la cantidad que ya tenia el
			 * stock mas la cantidad que se le queria agregar al stock
			 */
			p.getStock().setQuantity(p.getStock().getQuantity() + cantidad);
			return true;
		}

		return false;
	}

	/**
	 * Este metodo simula la venta de un producto reduciendo su stock en la
	 * cantidad de productos vendidos.
	 * 
	 * @param nombreProducto
	 *            el nombre del producto que se va a vender.
	 * @param cantidadVendida
	 *            la cantidad del producto que se va a vender
	 * @return
	 */
	public Boolean venderProducto(String nombreProducto, Integer cantidadVendida) {
		/*
		 * me fijo que el producto que le paso no es nulo y que el producto esta
		 * en el supermercado
		 */
		if (nombreProducto != null
				&& productos.buscarElemento(nombreProducto) != null) {
			/* agarro la cantidad actual del stock del producto */
			Integer cantidadActual = ((Producto) productos.buscarElemento(
					nombreProducto).getDato()).getStock().getQuantity();
			/*
			 * me fijo que la cantidad actual sea mayor a cero es decir que hay
			 * productos en stock(sino no se puede vender)
			 */
			if (cantidadActual > 0) {
				/*
				 * seteo la cantidad del stock del producto como la cantidad que
				 * tenia menos la cantidad vendida
				 */
				((Producto) productos.buscarElemento(nombreProducto).getDato())
						.getStock().setQuantity(
								cantidadActual - cantidadVendida);
				return true;
			}
		}
		return false;
	}

	/**
	 * Metodo que elimina un producto de la lista del supermercado y tambien su
	 * stock.
	 * 
	 * @param nombreProducto
	 * @return
	 */
	public Boolean eliminarProducto(String nombreProducto) {
		if (nombreProducto != null
				&& productos.buscarElemento(nombreProducto) != null) {
			return productos.eliminarElemento(nombreProducto);
		}
		return false;
	}

	public Double leerCodigo(Integer codigo) {
		if (codigo != null) {
			IElemento aux = productos.getPrimero();
			while (aux != null) {
				if (((Producto) aux.getDato()).getCode().equals(codigo)) {
					Producto p = (Producto) aux.getDato();
					if (p.getStock().getQuantity() > 1) {
						venderProducto(p.getName(), 1);
						return p.getPrice();
					}
				}
			}
		}
		return null;
	}

	public Double leerProductosEnCaja(TLista lista) {
		if (lista != null && !lista.esVacia()) {
			IElemento aux = lista.getPrimero();
			Double importeTotal = 0.0;
			while (aux != null) {
				importeTotal = importeTotal
						+ ((Producto) aux.getDato()).getPrice();
				aux = aux.getSiguiente();
			}
			return importeTotal;
		}
		return null;
	}
}
